ゼロからのOS自作入門 (Amazon、アフェリエイトではない)
人類は買ったほうが良いと思う
このページでは、勉強(写経)中に思ったことを書いてる
準備
環境構築
uint16_t data
だからこわかったゼロからのOS自作入門 (Amazon、アフェリエイトではない)
人類は買ったほうが良いと思う
このページでは、勉強(写経)中に思ったことを書いてる
準備
環境構築
#ゼロからのOS自作入門 #day07a_(割り込みの準備)
uint8_t msg_data_addr = cap_addr + 8;
if (msi_cap.header.bits.addr_64_capable) {
msi_cap.msg_upper_addr = ReadConfReg(dev, cap_addr + 8);
msg_data_addr = cap_addr + 12;
#ゼロからのOS自作入門 #07a:なぜmsg_data_addrを使わないのか
struct {
uint16_t interrupt_stack_table : 3;
uint16_t : 5;
DescripterType type : 4;
#ゼロからのOS自作入門 #day08b_(データ構造の移動)
day08bで書いた(後にmainから切り離した)InitSegmentation()
について
やっていること:GDTを書き換えて、DS/ES/FS/GSに0をセットし、CSに8(1<<3)・SSに16(2<<3)をセット
DS/ES/FS/GS/CS/SSがいわゆるセグメントレジスタらしい?
https://stackoverflow.com/questions/10810203/what-is-the-fs-gs-register-intended-for
#ゼロからのOS自作入門
MikanOS関連
GitHub - uchan-nos/mikanos at osbook_day02a
基本的にはこのコードを写経する
uchan-nos/mikanos/tree/osbook_day***
の部分を変えていく
#ゼロからのOS自作入門
キーボードは全体的にサクサク行きましたね まあドライバ周りもマウスでやったやつなぞるだけだし
タイマーの使い方を完全に忘れてしまっていた
kTextboxCursorTimerってなんだ・・・?
タイマーのIDみたいなものかなあ
#ゼロからのOS自作入門
よくわからなくなるので、同じページにまとめることにした
セグメンテーション
Segmentation faultでおなじみのアレ
segmentationは「分割・分裂・区分」みたいな意味
#ゼロからのOS自作入門
P166
コードセグメントのこと
実行可能コードが置いてあるメモリ区間のこと
#ゼロからのOS自作入門
コミットするの忘れてた
SetCSSSで止まってしまう なぜ?
そもそもCSSSってなんだ #CS #SS
SetupSegments()を読んでなかった
#ゼロからのOS自作入門
lvt_timer = (0b001 << 16) | 32; //masked, one-shot
という記述がわからん
きのうIssue上がってた https://github.com/uchan-nos/os-from-zero/issues/124
回答来てた 手元で実験したときの名残みたいなやつで、特に深い意味はないとのこと
時間計測の結果が表示されて、これを秒に直すのかな?と思ったら「これを小さくすればいいです」って言われてちょっとかなしくなった
#ゼロからのOS自作入門 #day05a_(文字_‘A’_描画)
#ゼロからのOS自作入門
LAPICTimerOnInterrupt()、いる?
普通にメインループのswitchで実行すれば良い気が・・・
#ゼロからのOS自作入門
リファクタリング最高~~~~
ファイル単位ごとにコミットしていけばよかったかもしれない・・・(console.[hc]pp
だけコミットみたいな)
Mouseクラス、どちらかというとMouseCursorクラスじゃね?と思ったけど、OnInterruptとかあるからMouseか・・・
微妙に直感的じゃない
#ゼロからのOS自作入門
const uint16_t kernel_cs = 1 << 3;
const uint16_t kernel_ss = 2 << 3;
kernel_cs == 0b0000'1000, kernel_ss == 0b0001'0000
#ゼロからのOS自作入門 #day09a_(重ね合わせ処理)
Consoleのコンストラクタも、わざわざPixelWriterを消してる
#ゼロからのOS自作入門 #day06b_(PCIデバイス探索)
ScanFunctionとかで、なぜ型にautoが多用されているのかよくわからなかった
例えばここ
ReadClassCodeの戻り値の型は普通にuint8_tに見える
autoは長い割に自明な型を省略するものだと思っていたけど違うのか?
#ゼロからのOS自作入門
アセンブリが出てきた
IoOut32書いてる時、outって書いてタブ押すとインデントされずに勝手にIoOut32になるのが最悪だった
VSCodeくん・・・?
pci.cppの記述量多すぎで泣いてしまった
#ゼロからのOS自作入門 #day06b_(PCIデバイス探索)
uint32_t MakeAddress(uint8_t bus, uint8_t device,
uint8_t function, uint8_t reg_addr) {
auto shl = [](uint32_t x, unsigned int bits) {
return x << bits;
#ゼロからのOS自作入門
やっとバックバッファが出てきた
バックバッファはゲーム開発には欠かせない要素だから、いつ出てくるのだろうと首を長くして待っていた
結局今出てるのは
実際に見える画面(名称がよくわからんのでフロントバッファとしておく)
#ゼロからのOS自作入門
ぜったいこれVector2Dは別のヘッダに移したほうが良いでしょ
多分graphic.hpp(をインクルードするファイル)以外で使わないからここに書いてあるんだろうけど、流石に長過ぎる
でも大幅にファイル構成を変えると悲しいことが起こりそうなので悩みどころ
本には「マウスカーソルをウィンドウに乗せるとちらつく」って書いてあったけど、うちの環境だと「マウスカーソルを動かすとちらつく」
#ゼロからのOS自作入門
ウィンドウのサイズ変えただけで動かなくなった
make cleanしたらEDKのビルドで止まるようになった
なんでエラーになったのかわからないけど、とりあえずエラー文の通りsrc/Confを~/edkにコピーしたら動いた
ウィンドウの縦幅を狭くしたのにWriteStringを消していなかったので、範囲外アクセスしてたらしい?
#ゼロからのOS自作入門
あまりにもはやすぎる
こうも目に見えて進捗がわかると楽しくなるな
NewLine()が呼ばれた時、window::Move()でフレームバッファをスクロールしてるのはわかるんだけど、カーソル位置とか変えないでいいの?
カーソル位置およびそれを元に書き込まれるbuffer_が使われるのはReflesh()と旧NewLine() (windowが設定されてなかったときの処理)だけなので大丈夫ということらしい?(P243)